package be.vdab.util;

import java.io.*;


public class Datum implements IDatum, Comparable<Datum>,Serializable{

	protected int dag;
	protected int maand;
	protected int jaar;
	
	public Datum() throws DateCheckerException{
		setDatum(1, 1, 1584);
	}
	
	public Datum(int i, int j, int k) throws DateCheckerException{
		setDatum(i, j, k);
	}
	
	@Override
	public String toString(){
		return String.format("%02d/%02d/%4d", getDag(),getMaand(),getJaar());
//		return getDag()+"/"+getMaand()+"/"+getJaar();
	}
	
	
	@Override
	public int compareTo(Datum o) {
		return o.hashCode()- hashCode();
	}
	@Override
	public int hashCode(){
		return (jaar*372)+(maand*31)+(dag);
	}

	
	@Override
	public void setDag(int dag) throws DateCheckerException {
		checkDate(dag, maand, jaar);
		this.dag=dag;
	}
	@Override
	public int getDag() {
		// TODO Auto-generated method stub
		return dag;
	}
	@Override
	public void setMaand(int maand) throws DateCheckerException {
		checkDate(dag, maand,jaar);
		this.maand=maand;		
	}
	@Override
	public int getMaand() {
		
		return maand;
	}
	@Override
	public void setJaar(int jaar) throws DateCheckerException {
		// TODO Auto-generated method stub
		checkDate(dag, maand, jaar);
		this.jaar=jaar;
	}
	@Override
	public int getJaar() {
		// TODO Auto-generated method stub
		return jaar;
	}
	@Override
	public void setDatum(int dag, int maand, int jaar) throws DateCheckerException{
		checkDate(dag, maand, jaar);
		this.dag = dag;
		this.maand = maand;
		this.jaar=jaar;
	}

	public void checkDate(int dag, int maand, int jaar) throws DateCheckerException{
		//		int dvdm[]= {31,28,31,30,31,30,31,31,30,31,30,31};
		//		if(!( jaar>1583 && jaar <4100 && maand >0 && maand <13 && dag >1 && dag <=(dvdm[maand-1]+( ( maand==2 && ( (jaar%4==0 && jaar%100!=0) || jaar%400==0 ))?1:0)))) throw new DateCheckerException();
		//jaren controleren
				if(jaar<1584 || jaar>4099){
					throw new DateCheckerException("Jaartal te groot of te klein (1584-4099 geldig)");
				}else{
					//maanden controleren
					if(maand<1 || maand >12){
						throw new DateCheckerException("Ongeldige maand!");
					}else{
						//dagen controleren
						if(maand ==1 || maand == 3 || maand == 5 || maand == 7 || maand == 8 || maand ==10 || maand == 12) {
							//dagen controleren bij even maanden
							if(dag<1 || dag>31){
								throw new DateCheckerException("Ongeldige dag!");
							}
						}else{
							//Dagen controleren bij oneven maanden
							if(dag<1 || dag>30){
								throw new DateCheckerException("Ongeldige dag!");
							}
						//februari schrikkeljaren :-) :-)
						if(maand == 2 && (jaar%4)==0 && jaar%100!=0 || jaar%400==0){
							/*//als jaar rest 100 0 is en jaar rest 400 niet nul is
							if(jaar%100==0 && jaar%400 != 0){
								//geen schrikkeljaar
								if(dag<1 || dag>28){
									throw new DateCheckerException("Geen schrikkeljaar 28 dagen!");
								}
							}*/
							//System.out.println("Schrikkeljaar");
							if(dag<1 || dag>29){
								throw new DateCheckerException("Schrikkeljaar (29 dagen)!");
							}
							
							
							}else{
								if(dag<1 || dag>28){
									throw new DateCheckerException("Geen schrikkeljaar (28 dagen)!");
								}
							
						}
							
						
						}
					}
				}
	}
}
